package com.edu.dsai.utils;

import lombok.Data;
import lombok.Getter;

/*
 * 每一个控制器函数的返回数据封装
 * 后端对前端的请求进行处理并响应
 * 作用就是：给前端发回更加有意义的数据包
 * 1.成功了
 * 2.失败了
 * */
@Data
public class R<T> {
    // 表示处理是否成功
    private boolean success;
    // 给前端的提示信息
    private String msg;
    // 存储真正的数据
    private T data;

    /*
     * 一、后端处理业务成功情况
     * R<T>:函数的返回值类型
     * static <T>中的<T>是泛型函数的标识
     * */
    // 1.1 成功时的两个形参
    public static <T> R<T> ok(String msg, T data) {
        R<T> r = new R<>();
        r.setSuccess(true);
        r.setMsg(msg);
        r.setData(data);
        return r;
    }

    // 1.1 成功时的两个形参
    public static <T> R<T> ok(String msg) {
        R<T> r = new R<>();
        r.setSuccess(true);
        r.setMsg(msg);
        r.setData(null);
        return r;
    }

    // 1.1 成功时的两个形参
    public static <T> R<T> ok(T data) {
        R<T> r = new R<>();
        r.setSuccess(true);
        r.setMsg("业务处理成功！");
        r.setData(data);
        return r;
    }

    /*
     * 二、后端处理业务失败情况
     * */
    // 2.1 成功时的两个形参
    public static <T> R<T> failed(String msg, T data) {
        R<T> r = new R<>();
        r.setSuccess(false);
        r.setMsg(msg);
        r.setData(data);
        return r;
    }

    // 1.1 成功时的两个形参
    public static <T> R<T> failed(String msg) {
        R<T> r = new R<>();
        r.setSuccess(false);
        r.setMsg(msg);
        r.setData(null);
        return r;
    }

    // 1.1 成功时的两个形参
    public static <T> R<T> failed(T data) {
        R<T> r = new R<>();
        r.setSuccess(false);
        r.setMsg("业务处理失败了！");
        r.setData(data);
        return r;
    }
}